package com.rzhkj.core.tools;

import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 缩略图类（通用） 本java类能将jpg、bmp、png、gif图片文件，进行等比或非等比的大小转换。 具体使用方法
 */
public enum CompressPic {
    INSTANCE;
    protected Log logger = LogFactory.getLog(CompressPic.class);


    /**
     * 缩略图类（通用） 本java类能将jpg、bmp、png、gif图片文件，进行等比或非等比的大小转换。 具体使用方法
     *
     * @param srcPic    原图   srcsrc/srcsrc.jpg
     * @param outputPic 压缩后图片 xxx/xxx.jpg
     * @param width     生成小图片宽度
     * @param height    生成小图片高度
     * @return
     */
    public String compressPic(File srcPic, String outputPic, int width, int height) throws IOException {
        return this.compressPic(srcPic, outputPic, width, height, false);
    }

    /**
     * 缩略图类（通用） 本java类能将jpg、bmp、png、gif图片文件，进行等比或非等比的大小转换。 具体使用方法
     *
     * @param srcPic    原图   srcsrc/srcsrc.jpg
     * @param outputPic 压缩后图片 xxx/xxx.jpg
     * @param width     生成小图片宽度
     * @param height    生成小图片高度
     * @param gp        是否等比缩放(默认为true)
     * @return
     */
    public String compressPic(File srcPic, String outputPic, int width, int height, boolean gp) throws IOException {
        if (!srcPic.exists()) {
            throw new FileNotFoundException("文件无法找到");
        }

        Image img = ImageIO.read(srcPic);
        // 判断图片格式是否正确
        if (img.getWidth(null) == -1) {
            throw new ImageFormatException("图片格式错误，或者不存在");
        }

        int newWidth = 0;
        int newHeight = 0;

        if (gp) {// 判断是否是等比缩放
            //获得原图宽高
            double oldwidth = img.getWidth(null);
            double oldheight = img.getHeight(null);

            // 为等比缩放计算输出的图片宽度及高度
            double rateWidth = (double) width / ((double) oldwidth);
            double rateHeight = (double) height / ((double) oldheight);

            if (oldwidth <= width && oldheight <= height) { //宽度和高度均比限定小
                newWidth = (int) oldwidth;
                newHeight = (int) oldheight;
            } else if (oldwidth > width && oldheight <= height) { //宽度溢出
                newWidth = width;
                newHeight = (int) (oldheight * rateWidth);
                logger.info(oldheight + "==" + rateWidth);
            } else if (oldwidth <= width && oldheight > height) {//高度溢出
                newWidth = (int) (oldwidth * rateHeight);
                newHeight = height;
            } else {
                //宽度和高度均溢出
                if (rateWidth > rateHeight) {  //高度缩放比例小，则按照高度缩放
                    newWidth = (int) (oldwidth * rateHeight);
                    newHeight = height;
                } else {//宽度缩放比例小，则按照宽度缩放
                    newWidth = width;
                    newHeight = (int) (oldheight * rateWidth);
                }
            }

        } else {
            newWidth = width; // 输出的图片宽度
            newHeight = height; // 输出的图片高度
        }
        BufferedImage tag = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB);
        /*
            * Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
		 */
        tag.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null);
        FileOutputStream out = new FileOutputStream(outputPic);
        // JPEGImageEncoder可适用于其他图片类型的转换
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
        encoder.encode(tag);
        out.close();

        return outputPic;
    }
}
